int writeSyntaxElement_Level_VLC1(SyntaxElement *se, DataPartition *dp, int profile_idc)
{
  int level = se->value1;
  int levabs = iabs(level);
  int sign = (level < 0 ? 1 : 0);

  if (levabs < 8)
  {
    se->len = levabs * 2 + sign - 1;
    se->inf = 1;
  }
  else if (levabs < 16) //8+8)
  {
    // escape code1
    //se->len = 14 + 1 + 4;
    se->len = 19;
    se->inf = (1 << 4) | ((levabs - 8) << 1) | sign;
  }
  else
  {
    int iLength = 28, numPrefix = 15;
    int iCodeword, addbit, offset;
    int levabsm16 = levabs - 16;

    // escape code2
    if ((levabsm16) >= 2048)
    {
      numPrefix++;
      while ((levabsm16) >= (1<<(numPrefix-3)) - 4096)
      {
        numPrefix++;
      }
    }

    addbit   = numPrefix - 15;
    iLength += (addbit << 1);
    offset   = (2048 << addbit) - 2048;

    iCodeword = (1 << (12+addbit))|((levabsm16) << 1)|sign;

    /* Assert to make sure that the code fits in the VLC */
    /* make sure that we are in High Profile to represent level_prefix > 15 */
    if (numPrefix > 15 && !IS_FREXT_PROFILE( profile_idc ))
    {
      //error( "level_prefix must be <= 15 except in High Profile\n",  1000 );
      se->len = 0x0000FFFF; // This can be some other big number
      se->inf = iCodeword;
      return (se->len);
    }
    
    se->len = iLength;
    se->inf = iCodeword;
  }


  symbol2vlc(se);

  writeUVLC2buffer(se, dp->bitstream);

  if(se->type != SE_HEADER)
    dp->bitstream->write_flag = 1;

#if TRACE
  if(dp->bitstream->trace_enabled)
    trace2out (se);
#endif

  return (se->len);
}


/*!
 ************************************************************************
 * \brief
 *    write VLC for Coeff Level
 ************************************************************************
 */
int writeSyntaxElement_Level_VLCN(SyntaxElement *se, int vlc, DataPartition *dp, int profile_idc)
{  
  int iCodeword;
  int iLength;

  int level = se->value1;
  int sign = (level < 0 ? 1 : 0);
  int levabs = iabs(level) - 1;  

  int shift = vlc - 1;        
  int escape = (15<<shift);

  if (levabs < escape)
  {
    int sufmask = ~((0xffffffff)<<shift);
    int suffix = (levabs)&sufmask;
    int numPrefix = (levabs)>>shift;

    iLength = numPrefix + vlc + 1;
    iCodeword = (1<<(shift+1))|(suffix<<1)|sign;
  }
  else
  {
    int addbit, offset;
    int levabsesc = levabs - escape;
    int numPrefix = 15;

    iLength = 28;    

    if ((levabsesc) >= 2048)
    {
      numPrefix++;
      while ((levabsesc) >= (1<<(numPrefix-3)) - 4096)
      {
        numPrefix++;
      }
    }

    addbit  = numPrefix - 15;

    iLength += (addbit<<1);
    offset = (2048 << addbit) - 2048;

    iCodeword = (1 << (12 + addbit)) | ((levabsesc - offset) << 1) | sign;

    /* Assert to make sure that the code fits in the VLC */
    /* make sure that we are in High Profile to represent level_prefix > 15 */
    if (numPrefix > 15 &&  !IS_FREXT_PROFILE( profile_idc ))
    {
      //error( "level_prefix must be <= 15 except in High Profile\n",  1000 );
      se->len = 0x0000FFFF; // This can be some other big number
      se->inf = iCodeword;
      return (se->len);
    }
  }
  se->len = iLength;
  se->inf = iCodeword;

  symbol2vlc(se);

  writeUVLC2buffer(se, dp->bitstream);

  if(se->type != SE_HEADER)
    dp->bitstream->write_flag = 1;

#if TRACE
  if(dp->bitstream->trace_enabled)
    trace2out (se);
#endif

  return (se->len);
}